<?php
declare (strict_types = 1);

namespace app\admin\controller;
use app\admin\model\RoleModel;
use app\admin\model\UserModel;
use app\admin\model\RoleAccessModel;
class Role extends Base
{

    /**
     * 角色列表
     */
    public function index(){
        if(request()->isPost()){
            $page=empty(request()->post('page/d'))?1:request()->post('page/d');
            $limit=empty(request()->post('limit/d'))?10:request()->post('limit/d');
            if(empty($limit) || $limit>100){
                $limit=100;
            }
            $list=RoleModel::limit(($page-1)*$limit,$limit)
                ->select();
            $count=RoleModel::count('id');
            return $this->showList($list,$count);
        }    
        return $this->fetch();
    }

    /**
     * 角色添加
     */
    public function add(){

        $info['action']="添加";
        if(request()->isPost()){
            $data=request()->post();
            try {
                $this->validate($data,'Role');
            } catch (\Exception $e) {
                return $this->error($e->getMessage());
            }

            $data['status']=(isset($data['status']) && $data['status']=="on")?1:0;
            if(RoleModel::create($data)){
                return $this->success('操作成功',(string)url('index'));
            }
            return $this->error('添加失败');
        }

        $this->assign(['info'=>$info]);
        return $this->fetch();
    }

    /**
     * 角色修改
     */
    public function edit(){

        $id=request()->get('id','','intval');
        if(!empty($id)){
            $info=RoleModel::find($id);
            if(empty($info)){
                return $this->error('信息不存在');
            }
            $info=$info->toArray();
            $info['action']='修改';
        }else{
            return $this->error('信息不存在');
        }

        if(request()->isPost()){
            $data=request()->post();
            try {
                $this->validate($data,'Role');
            } catch (\Exception $e) {
                return $this->error($e->getMessage());
            }

            $data['status']=(isset($data['status']) && $data['status']=="on")?1:0;
            if(RoleModel::update($data,['id'=>$id])){
                return $this->success('操作成功',(string)url('index'));
            }
            return $this->error('修改失败');
        }

        $this->assign(['info'=>$info]);
        return $this->fetch('add');
    }

    /**
     * 角色删除
     */
    public function del(){
        $id=request()->post('id','','intval');

        if(empty($id)){
            return $this->error('系统错误');
        }
        if(UserModel::where(['role_id'=>$id])->find()){
            return $this->error('该角色下有用户，请先删除用户');
        }

        if(RoleModel::destroy($id)){
            return $this->success('删除成功');
        }else{
            return $this->error('删除失败');
        }
    }

    /**
     * 设置角色权限
     */

    public function setRoleAccess(){
        $role_id=request()->get('id','','intval');
        if(!RoleModel::find($role_id)){
            return $this->error('信息不存在');
        }
        
        if(request()->isPost()){
            $access=request()->post('access');
            $data=treeToArray($access);
            $ids=array_column($data,'id');
            if(empty($ids)){
                return $this->error('权限不能为空');
            }
            $access_ids=array_column(RoleModel::getRoleAccess($role_id)->toArray(),'access_id');
            //增加$ids有的 access_ids 没有的
            if($yesids=array_diff($ids,$access_ids))
            {
                foreach ($yesids as $k => $v) {
                    $add[]=[
                        'access_id'=>$v,
                        'role_id'=>$role_id
                    ];
                }
                $RoleAccessModel=new RoleAccessModel();
                $RoleAccessModel->saveAll($add);
            }
            //删除access_ids 有的 ids 没有的
            if($noids=array_diff($access_ids,$ids)){
                RoleAccessModel::where('access_id','in',join(',',$noids))->delete();
            }
            RoleModel::setAll($role_id);
            return $this->success('操作成功');
        }
        $RoleAccessTree=RoleModel::getRoleAccessTree($role_id);
        $this->assign([
            'RoleAccessTree'=>$RoleAccessTree,
        ]);
        return $this->fetch('setroleaccess');
    }

    
}
